// 纪中1550.[DFS递归动态规划]/最小步数steps
// printf("%d\n", (int)1e3);  1000
// 题解 https://blog.csdn.net/bigwinner888/article/details/107140948
// 从起点到终点有N步，如果“走”第K步，将会得到A[K]元钱，A[K]可能为负数。
// 你也可以花100元钱“跳过”当前的这一步，即不会得到A[K]。但是任何时刻身上的钱都必须是非负的。开始时，你身上共有0元。
// 给定数组A，求在能到达终点的情况下最小需要走过（即不是用100元钱跳过）的步数。注意：最后一步必须走，不能选择跳过。
// 输入共有两行。第一行为整数N（0<=N<=100）。
// 第二行有N个整数，第K个数为A[K]，-10000<=A[K]<=10000
// 输出一个整数，表示需要走的最少步数。若无法走到终点，输出-1。
// 输入 6
//  30 30 30 30 30 30
// 输出 5
// 【普及模拟】最小步数(DP)
// 所以我们可以开一个三维数组F。F[i][j][0]表示走了j步到当前位置i没跳过的剩余钱数，
// 而F[i][j][1]表示走了j步到当前位置i跳过的剩余钱数。
// 这时我们可以得到状态转移方程了：
//  f[i][j][0]=max(f[i-1][j-1][0],f[i-1][j-1][1])+a[i];
//  f[i][j][1]=max(f[i-1][j][0],f[i-1][j][1])-100;
// 注：要判断才能执行以下转移方程，钱数不能<0。
// 
// 方法一（记忆化搜索dfs）：
// 每次经过一个点就会有两种状态（一种是用100块跳过，一种是+A[i]走过去）
// 最后一步必须走，所以我们只DP到n-1次
// 对于第i格，我们走了step步时所得到的最多money，用f[i,step]表示。
// 剪枝1.步数超了。当走到第i格的步数>=当前走到终点的最优步数时剪枝。
// 剪枝2.钱不够。当走到第i格使用step步时的money还<=f[i,step],剪枝。

#include <bits/stdc++.h>
using namespace std;

#define DEBUG_
#ifdef DEBUG_
#define PF(...) printf(__VA_ARGS__)
#define FRE(x)                    \
  freopen("d:/oj/" #x ".in", "r", \
          stdin)  //,freopen("d:/oj/"#x".out","w",stdout)
#define FREC fclose(stdin), fclose(stdout)
#else
#define PF(...)
#define FRE(x)
#define FREC
#endif

const static int MAX_VAL = 0x7fff0000;

vector<int> vtArray;
// int hasM[100][100] = {0};    // 第[i]格[step] = 剩余钱

// 在  i格子里
void dfsTravel(size_t i, int money, int steps, int& ans) {
  PF(".............i=%d, stp=%d, mon=%d\n", i, steps, money);
  // 剪枝,最后一步之前超了
  if (steps + 1 >= ans) {
    return;
  }
  //  剪枝,走到第i格使用step步时的money
  PF(".i=%d, stp=%d, mon=%d\n", i, steps, money);
  //    if (hasM[i][steps] >= money) {
  //        PF("MORE----i=%d, stp=%d, mon=%d,%d\n", i, steps, money,
  //        hasM[i][steps]); return;
  //    }

  //    hasM[i][steps] = money;
  if (i == vtArray.size()) {
    if (money + vtArray[i] >= 0) {
      ans = steps + 1;
    }
    return;
  }
  if (money - 100 >= 0) {
    PF("..Not.i=%d\n", i + 1);
    dfsTravel(i + 1, money - 100, steps, ans);
  }
  if (money + vtArray[i] >= 0) {
    PF("..Yes.i=%d\n", i + 1);
    dfsTravel(i + 1, money + vtArray[i], steps + 1, ans);
  }
}

int main() {
  //    srand(15); for (int i = 0; i < 10; i++) PF("%d ", (rand() % 150) -
  //    rand() % 100);  return 0;
  FRE(steps);

  //    memset(hasM, -1, sizeof(hasM));   // ?
  int n = 0;
  scanf("%d", &n);
  vtArray.resize(n + 1);
  for (int i = 1; i <= n; i++) scanf("%d", &vtArray[i]);
  int ans = MAX_VAL;
  dfsTravel(1, 0, 0, ans);
  if (ans == MAX_VAL) {
    printf("-1\n");
  } else {
    printf("%d\n", ans);
  }
  FREC;
  return 0;
}
